home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
xpandisk.zip
/
XPANDISK.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-10-31
|
38KB
|
864 lines
; XpanDisk is a virtual disk device driver for expanded memory.
; The driver has the capability of releasing memory allocated to
; its drive, making it available to other applications. All data
; is lost if the drive is resized. XPANBOSS.COM is the control
; program for the XPANDISK.SYS driver. PC Magazine 10-31-88
_TEXT SEGMENT PUBLIC 'CODE'
ASSUME CS:_TEXT,DS:_TEXT
ASSUME ES:_TEXT,SS:_TEXT
ORG 0H
;************* DEVICE_HEADER *************;
POINTER DD -1 ;Minus one indicates one driver.
ATTRIBUTE DW 0100000000000000B ;Block device with IOCTL support.
DEVICE_STAG DW STRATEGY ;Pointer to strategy procedure.
DEVICE_INT DW INTERRUPT ;Pointer to interrupt procedure.
DEVICE_NAME DB 1, 7 DUP (?) ;One unit.
REQUEST_HEADER STRUC
HEADER_LENGTH DB ?
UNIT_CODE DB ?
COMMAND_CODE DB ?
STATUS DW ?
RESERVED DQ ?
REQUEST_HEADER ENDS
INIT_PACKET STRUC
INIT_HEADER DB (TYPE REQUEST_HEADER) DUP(?)
UNITS DB ?
ENDING_OFFSET DW ?
ENDING_SEGMENT DW ?
ARGUMENTS_OR_ARRAY_OFF DW ?
ARGUMENTS_OR_ARRAY_SEG DW ?
INIT_PACKET ENDS
MEDIA_CHECK_PACKET STRUC
MEDIA_CHECK_HEADER DB (TYPE REQUEST_HEADER) DUP(?)
CHECK_MEDIA_DESCRIPTOR DB ?
RETURN_BYTE DB ?
MEDIA_CHECK_PACKET ENDS
BUILD_BPB_PACKET STRUC
BUILD_BPB_HEADER DB (TYPE REQUEST_HEADER) DUP(?)
BPB_MEDIA_DESCRIPTOR DB ?
BPB_TRANSFER_ADDRESS DD ?
BPB_OFFSET DW ?
BPB_SEGMENT DW ?
BUILD_BPB_PACKET ENDS
INPUT_OUTPUT_PACKET STRUC
INPUT_OUTPUT_HEADER DB (TYPE REQUEST_HEADER) DUP(?)
IO_MEDIA_DESCRIPTOR DB ?
TRANSFER_OFFSET DW ?
TRANSFER_SEGMENT DW ?
BYTE_OR_SECTOR_COUNT DW ?
STARTING_SECTOR DW ?
INPUT_OUTPUT_PACKET ENDS
CR EQU 13
LF EQU 10
CTRL_Z EQU 26
SPACE EQU 32
BOX EQU 254
DONE EQU 0100H ;STATUS CODES
WRITE_PROTECT EQU 8000H
UNKNOWN_UNIT EQU 8001H
DEVICE_NOT_READY EQU 8002H
UNKNOWN_COMMAND EQU 8003H
SECTOR_NOT_FOUND EQU 8008H
MAX_COMMAND EQU 12
EMM_FLAG DB 1
REQUEST_PACKET LABEL DWORD
REQUEST_OFFSET DW ?
REQUEST_SEG DW ?
;-----------------------------------------------------------------------------;
; The only task of the strategy is to save the pointer to the request header. ;
;-----------------------------------------------------------------------------;
STRATEGY PROC FAR
MOV CS:REQUEST_OFFSET,BX ;Request header address is
MOV CS:REQUEST_SEG,ES ; passed in ES:BX.
RET
STRATEGY ENDP
;------------------------------------------------------------------------;
; The interrupt procedure will be called immediately after the strategy. ;
;------------------------------------------------------------------------;
INTERRUPT PROC FAR
PUSH AX ;Responsible for all registers.
PUSH BX
PUSH CX
PUSH DX
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH BP
PUSHF
CLD ;All string moves forward.
PUSH CS ;Point to our data.
POP DS
CMP EMM_FLAG,1 ;Was EMM found?
MOV AX,UNKNOWN_UNIT ;Assume no.
JNZ EXIT ;If no expanded manager, exit.
LES DI,REQUEST_PACKET ;Retrieve request header pointer.
MOV BL,ES:COMMAND_CODE[DI] ;Retrieve command.
CMP BL,MAX_COMMAND ;Do we support it?
MOV AX,UNKNOWN_COMMAND ;Assume no.
JA EXIT ;If out of range, exit.
XOR BH,BH ;Zero in high half of command.
SHL BX,1 ;Convert to word pointer.
CALL DISPATCH_TABLE[BX] ;Go do our thing.
EXIT: LDS DI,REQUEST_PACKET ;Retrieve request header pointer.
OR AX,DONE
MOV STATUS[DI],AX ;Tell DOS we are done.
POPF ;Restore rest of registers.
POP BP ;Restore registers.
POP DI
POP SI
POP ES
POP DS
POP DX
POP CX
POP BX
POP AX
RET ;Far return back to DOS.
INTERRUPT ENDP
EVEN
MIN_RESIDENT EQU $
DISPATCH_TABLE LABEL WORD
DW INIT, MEDIA_CHECK, BUILD_BPB, IOCTL_INPUT, INPUT
DW INPUT_NOWAIT, INPUT_STATUS, INPUT_FLUSH, OUTPUT
DW OUTPUT_VERIFY, OUTPUT_STATUS, OUTPUT_FLUSH, IOCTL_OUTPUT
BOOT_RECORD LABEL BYTE
DB 3 DUP (0)
DB "XPANDISK"
BIOS_PARAMETER_BLOCK LABEL BYTE
BYTES_PER_SECTOR DW SECTOR_SIZE_DEFAULT
SECTORS_PER_CLUSTER DB 1
RESERVED_SECTORS DW 1
NUMBER_OF_FATS DB 1
ROOT_DIRECTORY_ENTRIES DW ROOT_ENTRIES_DEFAULT
TOTAL_SECTORS DW 1024 / SECTOR_SIZE_DEFAULT * DISK_SIZE_DEFAULT
MEDIA_DESCRIPTOR_BYTE DB MEDIA_DESCRIPTOR
SECTORS_PER_FAT DW 1
SECTORS_PER_TRACK DW 8
NUMBER_OF_HEADS DW 1
HIDDEN_SECTORS DW 0
BOOT_RECORD_LENGTH EQU $ - BOOT_RECORD
MEDIA_DESCRIPTOR EQU 0FEH
DISK_SIZE_DEFAULT EQU 64
DISK_SIZE_MINIMUM EQU 16
DISK_SIZE_MAXIMUM EQU 32 * 1024
SECTOR_SIZE_DEFAULT EQU 256
SECTOR_SIZE_MINIMUM EQU 128
SECTOR_SIZE_MAXIMUM EQU 512
ROOT_ENTRIES_DEFAULT EQU 64
ROOT_ENTRIES_MINIMUM EQU 4
ROOT_ENTRIES_MAXIMUM EQU 512
DISK_SIZE_TEMP DW DISK_SIZE_DEFAULT
SECTOR_SIZE_TEMP DW SECTOR_SIZE_DEFAULT
ROOT_ENTRIES_TEMP DW ROOT_ENTRIES_DEFAULT
DISK_SIZE DW DISK_SIZE_DEFAULT
PARA_FLAG DB ?
READ_ONLY_FLAG DB 0
FORMAT_FLAG DB 1
BPB_ARRAY DW BIOS_PARAMETER_BLOCK
VOLUME_LABEL LABEL BYTE
DB "PCMAG",SPACE,BOX,SPACE,"MJM"
DB 28H
DT 0
DW 6000H ;Date July 1, 1988
DW 10E1H ;Time 12:00pm
DB 6 DUP (0)
VOLUME_LENGTH EQU $ - VOLUME_LABEL
PASSWORD DB "PC Magazine Productivity"
PASSWORD_LENGTH EQU $ - PASSWORD
DISK_SIZE_MSG DB CR,LF,"Disk Size ",0
SECTOR_SIZE_MSG DB "K",CR,LF,"Sector Size ",0
DIRECTORY_ENTRIES_MSG DB CR,LF,"Directory Entries ",0
MEDIA_NOT_CHANGED EQU 1
MEDIA_CHANGED EQU -1
TWELVE_BIT_FAT EQU 4087
ONE_K EQU 1024
SIXTEEN_K EQU 16384
THIRTY_TWO_K EQU 32768
INPUT_COMMAND EQU 4
COMMAND DB ?
FRAME_SEGMENT DW ?
HANDLE DW ?
PAGES DW ?
;--------------------------------------------------------------;
; Character device functions; ignore and return no error code. ;
;--------------------------------------------------------------;
INPUT_NOWAIT:
IN